/*******************************************************************
 * author   :  Charlies-ls
 * Date     :  2021-09-26
 * Function :  list
 * Copyright (c) 2021. artestplay@outlook.com. All Rights Reserved.
 *******************************************************************/

#ifndef AX_LIST_H
#define AX_LIST_H

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct ax_list ax_list;
typedef struct ax_list_node ax_list_node;
struct ax_list_node
{
  void *data;
  ax_list_node* prev,*next;
};

struct ax_list
{
    ax_list_node* head;
    ax_list_node* tail;
    int count;
};

ax_list*      ax_list_create();
void          ax_list_destory(ax_list*l);
void          ax_list_destory_all(ax_list*l);
void          ax_list_clear(ax_list* l);
ax_list_node* ax_list_push_front(ax_list*list,ax_list_node* node);
ax_list_node* ax_list_push_back(ax_list*list,ax_list_node* node);
ax_list_node* ax_list_del(ax_list*list,ax_list_node*node);
ax_list_node* ax_list_del_front(ax_list*list);
ax_list_node* ax_list_del_back(ax_list*list);
ax_list_node* ax_list_insert_before(ax_list*list,ax_list_node* node_after,ax_list_node*node);
ax_list_node* ax_list_insert_after(ax_list*list,ax_list_node* node_before,ax_list_node*node);

ax_list_node* ax_list_add_push_front_data(ax_list*list,void* data);
ax_list_node* ax_list_push_back_data(ax_list*list,void* data);
ax_list_node* ax_list_del_data(ax_list* list,void* data);
ax_list_node* ax_list_insert_data_before(ax_list*list,ax_list_node* node_after,void*data);
ax_list_node* ax_list_insert_data_after(ax_list*list,ax_list_node* node_before,void*data);

ax_list_node* ax_list_front(ax_list* list);
ax_list_node* ax_list_back(ax_list* list);
int           ax_list_size(ax_list* list);

#define ax_list_foreach(list, node) \
                for(ax_list_node* node=list->head;node!=0;node=node->next)

#define ax_list_foreach2(list,node) \
        for(ax_list_node*node=list->head;node!=0;)

#ifdef __cplusplus
}
#endif

#endif
